package day2;
/**
 * 方法和字段
 * 一个类可以包含多个字段(field)和方法(method)。
 * 字段(field)是类的状态变量，方法(method)是类的行为。
 * 字段的修饰符可以是public、protected、private，也可以是static，也可以是final。
 *      public表示该字段可以被其他类访问。
 *      protected表示该字段可以被同一个包中的其他类访问。
 *      private表示该字段只能被本类访问。
 *          定义private字段的目的是不希望字段可以被外部代码随意修改，我们可以在内部对字段进行检查，从而避免外部代码对字段的不合理修改。
 *      static表示该字段是一个类变量，它在内存中只有一份，可以被所有对象共享。
 *      final表示该字段是一个常量，它的值一旦被初始化就不能被修改。
 * 方法的修饰符可以是public、protected、private、static、final、abstract、synchronized、native。
 *  定义方法的语法如下：
 *    修饰符 返回类型 方法名(参数列表) {
 *        // 方法体
 *        return 返回值;
 *    }
 *  定义private方法的目的是不希望外部代码调用这些方法，而是通过public方法来调用。
 *  如果返回值类型是void，可以省略return语句。
 * 
 * this变量:在方法内部，可以使用一个隐含的变量this，它始终指向当前实例。因此，通过this.field就可以访问当前实例的字段。
 */

 /**
  * 基本数据类型参数的传递: 属于调用方值的复制，即双方各自的后续修改互不影响。
  * 引用数据类型参数的传递: 属于引用的复制，即双方指向同一个对象，任何一方的修改都会影响对方。
  */

  /**
   * Java中String和String[]都是引用类型，但是String是不可变类型，而String[]是可变类型。
   *     String 类型的对象是不可变的，也就是说，一旦创建了一个 String 对象，就无法再修改它的值，任何对 String 对象的修改都会创建一个新的对象
   * 对于不可变类型，如果需要修改其值，必须重新创建对象，否则会导致原有对象无法访问。
   * 对于可变类型，如果需要修改其值，可以直接修改对象，不会导致原有对象无法访问。
   */
class Person {
    public String name;
    private int age;
    private String[] arr;

    public void setAge(int age) {
        if (age < 0 || age > 100) {
            throw new IllegalArgumentException("invalid age value");
        }
        this.age = age;
    }
    public int getAge() {
        return this.age;
    }

    public void setArr(String[] arr) {
        this.arr = arr;
    }
    public String getArr() {
        return this.arr[0] + " " + this.arr[1];
    }

}
public class Main {
    public static void main(String[] args) {
        String[] fullName = new String[] { "Homer", "Simpson" };
        int n = 12;
        // 创建Person对象:
        Person ming = new Person();
        // 设置字段:
        ming.name = "Ming";
        ming.setAge(n);
        ming.setArr(fullName);
        // 访问字段:
        n = 20;
        System.out.println(ming.name); // Ming
        System.out.println(ming.getAge()); // 0
        System.out.println("Hello, world!");

        System.out.println(ming.getArr()); // Homer Simpson
        
        fullName[0] = "Bart";
        System.out.println(ming.getArr()); // Bart Simpson

        String m = "Homer";
        System.out.println(m); // Homer
        m = "Bart";
        System.out.println(m); // Bart
    }
}
